package br.com.gbvbahia.mybooks.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import br.com.gbvbahia.commons.dao.InterfaceDAO;
import br.com.gbvbahia.mybooks.constantes.StatusLivro;
import br.com.gbvbahia.mybooks.constantes.TipoLivro;
import br.com.gbvbahia.mybooks.dao.contract.DB;
import br.com.gbvbahia.mybooks.modelos.LivroVO;
import br.com.gbvbahia.mybooks.modelos.RemovidoVO;

public class LivroDAO extends InterfaceDAO<LivroVO, String> {

	public static final String LIVRO_TABLE_NAME = "livros";
	public static final String[] columns = { "id", "nome", "autor", "edicao",
			"isbn", "descricao", "ano", "status", "nota", "avaliacao", "tipo",
			"sincronizado", "data_alteracao", "cd_editora", "recomendado", "pre_avaliacao" };
	private RemovidoDAO removidoDao;
	
	
	public LivroDAO(Context context) {
		super(new DB(context));
		removidoDao = new RemovidoDAO(context);
	}

	public static final int TODOS = 0;
	public static final int AVALIADOS = 1;

	public int contarLivros(int contagem) {
		Cursor cursor = null;
		try {
			String where = null;
			switch (contagem) {
			case TODOS:
				where = "";
				break;
			case AVALIADOS:
				where = " WHERE " + columns[8] + " > -1";
				break;
			default:
				break;
			}
			cursor = getDataBase().rawQuery(
					"SELECT * FROM " + LIVRO_TABLE_NAME + where + " ;", null);
			return cursor.getCount();
		} finally {
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
		}
	}

	@Override
	protected String getColumnIdName() {
		return columns[0];
	}

	/**
	 * Retorna os livros por nome.
	 * 
	 * @param name
	 * @return
	 */
	public List<LivroVO> getLivrosLikeName(String name) {
		Cursor cursor = null;
		try {
			cursor = getDataBase().rawQuery(
					"SELECT * FROM " + LIVRO_TABLE_NAME + " WHERE "
							+ columns[1] + " LIKE ? ;",
					new String[] { "%" + name + "%" });
			List<LivroVO> toReturn = new ArrayList<LivroVO>();
			while (cursor.moveToNext()) {
				toReturn.add(getFromCursor(cursor));
			}
			return toReturn;
		} finally {
			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
		}
	}

	
	
	@Override
	public long delete(LivroVO vo) {
		RemovidoVO rem = new RemovidoVO();
		rem.setId(vo.getId());
		long result = super.delete(vo);
		removidoDao.insert(rem);
		return result;
	}

	@Override
	protected String getTableName() {
		return LIVRO_TABLE_NAME;
	}

	@Override
	protected void populateContentValues(ContentValues cv, LivroVO vo) {
		cv.put(columns[0], vo.getId());
		cv.put(columns[1], vo.getNomeLivro());
		cv.put(columns[2], vo.getAutorLivro());
		cv.put(columns[3], vo.getEdicaoLivro());
		cv.put(columns[4], vo.getIsbnLivro());
		cv.put(columns[5], vo.getDescricao());
		cv.put(columns[6], vo.getAno());
		cv.put(columns[7], vo.getStatus() == null ? null : vo.getStatus()
				.toString());
		cv.put(columns[8], vo.getNota());
		cv.put(columns[9], vo.getAvaliacao());
		cv.put(columns[10], vo.getTipo() == null ? null : vo.getTipo()
				.toString());
		cv.put(columns[11], vo.getSincronizado());
		cv.put(columns[12], Long.toString(vo.getDataAlteracao()));
		cv.put(columns[13], vo.getCdEditora());
		cv.put(columns[14], vo.getRecomendado());
		cv.put(columns[15], vo.getPreAvaliacao());
	}

	@Override
	protected LivroVO getFromCursor(Cursor cursor) {
		LivroVO toReturn = new LivroVO();
		toReturn.setId(cursor.getString(cursor.getColumnIndex(columns[0])));
		toReturn.setNomeLivro(cursor.getString(cursor
				.getColumnIndex(columns[1])));
		toReturn.setAutorLivro(cursor.getString(cursor
				.getColumnIndex(columns[2])));
		toReturn.setEdicaoLivro(cursor.getInt(cursor.getColumnIndex(columns[3])));
		toReturn.setIsbnLivro(cursor.getString(cursor
				.getColumnIndex(columns[4])));
		toReturn.setDescricao(cursor.getString(cursor
				.getColumnIndex(columns[5])));
		toReturn.setAno(cursor.getInt(cursor.getColumnIndex(columns[6])));
		toReturn.setStatus(StatusLivro.getStatus(cursor.getString(cursor
				.getColumnIndex(columns[7]))));
		toReturn.setNota(cursor.getInt(cursor.getColumnIndex(columns[8])));
		toReturn.setAvaliacao(cursor.getString(cursor
				.getColumnIndex(columns[9])));
		toReturn.setTipo(TipoLivro.getTipo(cursor.getString(cursor
				.getColumnIndex(columns[10]))));
		toReturn.setSincronizado(cursor.getInt(cursor
				.getColumnIndex(columns[11])));
		toReturn.setDataAlteracao(Long.parseLong(cursor.getString(cursor
				.getColumnIndex(columns[12]))));
		toReturn.setCdEditora(cursor.getString(cursor
				.getColumnIndex(columns[13])));
		toReturn.setRecomendado(cursor.getInt(cursor
				.getColumnIndex(columns[14])));
		toReturn.setPreAvaliacao(cursor.getString(cursor
				.getColumnIndex(columns[15])));
		return toReturn;
	}

	@Override
	protected String[] getColumNames() {
		return columns;
	}

	@Override
	protected String getColumnOrderDefault() {
		return columns[1];
	}

}
